home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / sun3src / asm_linkage.h < prev    next >
Encoding:
C/C++ Source or Header  |  1990-12-19  |  2.3 KB  |  109 lines

  1.  
  2. /*    @(#)asm_linkage.h 1.1 86/09/27 SMI    */
  3.  
  4. /*
  5.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  6.  */
  7.  
  8. /*
  9.  * Entry macros for assembler subroutines.
  10.  */
  11. #define    IDENTITY(x) x
  12. #define    NAME(x) IDENTITY(_)x
  13.  
  14. #ifdef GPROF
  15. #define ENTRY(x)  \
  16.     .globl    NAME(x); \
  17. NAME(x): \
  18.     link a6,#0; \
  19.     movl #1f,a0; \
  20.     jbsr mcount; \
  21.     unlk a6; \
  22.     .bss; \
  23.     .even; \
  24. 1:    .skip 4; \
  25.     .text
  26.  
  27. #define ENTRY2(x,y)  \
  28.     .globl    NAME(x), NAME(y); \
  29. NAME(x): ; \
  30. NAME(y):   \
  31.     link a6,#0; \
  32.     movl #1f,a0; \
  33.     jbsr mcount; \
  34.     unlk a6; \
  35.     .bss; \
  36.     .even; \
  37. 1:    .skip 4; \
  38.     .text
  39.  
  40. /*
  41.  * CCENTRY is for cc known subroutines like ldivt which
  42.  * know and use a0, a1, d0 and d1.  This means we have to
  43.  * save them.
  44.  */
  45. #define CCENTRY(x)  \
  46.     .globl    x; \
  47. x: \
  48.     link a6,#-16; \
  49.     moveml #0x0303,sp@; \
  50.     movl #1f,a0; \
  51.     jbsr mcount; \
  52.     moveml sp@,#0x0303; \
  53.     unlk a6; \
  54.     .bss; \
  55.     .even; \
  56. 1:    .skip 4; \
  57.     .text
  58. #else GPROF
  59. #define ENTRY(x)  \
  60.     .globl    NAME(x); \
  61. NAME(x):
  62.  
  63. #define ENTRY2(x,y)  \
  64.     .globl    NAME(x), NAME(y); \
  65. NAME(x): \
  66. NAME(y):
  67.  
  68. #define CCENTRY(x)  \
  69.     .globl    x; \
  70. x:
  71. #endif GPROF
  72.  
  73. /*
  74.  * Macro for autovectored interrupts.
  75.  */
  76. #define IOINTR(LEVEL) \
  77.     moveml    #0xE0E0,sp@-    /* save regs we trash <d0,d1,d2,a0,a1,a2> */;\
  78.     movl    sp,d2        /* save copy of previous sp */;\
  79.     cmpl    #eintstack,sp    /* on interrupt stack? */;\
  80.     jls    1f        /* yes, skip */;\
  81.     lea    eintstack,sp    /* no, switch to interrupt stack */;\
  82. 1:    movl    #_level/**/LEVEL/**/_vector,a2    /* get vector ptr */;\
  83. 2:    movl    a2@+,a1        /* get routine address */;\
  84.     jsr    a1@        /* go there */;\
  85.     tstl    d0        /* success? */;\
  86.     beqs    2b        /* no, try next one */;\
  87.     movl    d2,sp        /* restore stack pointer */;\
  88.     cmpl    #0x80000000,d0    /* spurious? */;\
  89.     jeq    rei_iop        /* yes */;\
  90.     clrl    _level/**/LEVEL/**/_spurious    /* no, clr spurious cnt */;\
  91.     jra    rei_iop
  92.  
  93. /*
  94.  * Macro for vectored interrupts.
  95.  */
  96. #define VECINTR(ifunc, cfunc, carg) \
  97.     .globl    ifunc;\
  98. ifunc:;\
  99.     moveml    #0xE0C0,sp@-    /* save regs we trash <d0,d1,d2,a0,a1> */;\
  100.     movl    sp,d2        /* save copy of previous sp */;\
  101.     cmpl    #eintstack,sp    /* on interrupt stack? */;\
  102.     jls    1f        /* yes, skip */;\
  103.     lea    eintstack,sp    /* no, switch to interrupt stack */;\
  104. 1:    movl    carg,sp@-    /* push arg to interrupt routine */;\
  105.     jsr    cfunc        /* go to it */;\
  106.     movl    d2,sp        /* restore stack pointer */;\
  107.         moveml  sp@+,#0x0307    /* restore saved registers <a1,a0,d2,d1,d0> */;\
  108.     jra    rei_io
  109.